package com.ruoyi.restaurant.service.impl;

import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.restaurant.domain.DiningTable;
import com.ruoyi.restaurant.mapper.DiningTableMapper;
import com.ruoyi.restaurant.service.IDiningTableService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class DiningTableServiceImpl implements IDiningTableService {
    @Autowired
    private DiningTableMapper diningTableMapper;

    /**
     * 查询餐台列表
     *
     * @param diningTable 餐台信息
     * @return 餐台集合
     */
    @Override
    public List<DiningTable> selectDiningTableList(DiningTable diningTable) {
        return diningTableMapper.selectDiningTableList(diningTable);
    }

    /**
     * 根据ID查询餐台
     *
     * @param id 餐台ID
     * @return 餐台信息
     */
    @Override
    public DiningTable selectDiningTableById(Long id) {
        return diningTableMapper.selectDiningTableById(id);
    }

    /**
     * 根据餐台号查询餐台
     *
     * @param tableNumber 餐台号
     * @return 餐台信息
     */
    @Override
    public DiningTable selectDiningTableByNumber(String tableNumber) {
        return diningTableMapper.selectDiningTableByNumber(tableNumber);
    }

    /**
     * 新增餐台
     *
     * @param diningTable 餐台信息
     * @return 结果
     */
    @Override
    public int insertDiningTable(DiningTable diningTable) {
        // 检查餐台号是否已存在
        DiningTable existTable = diningTableMapper.selectDiningTableByNumber(diningTable.getTableNumber());
        if (existTable != null) {
            throw new ServiceException("餐台号已存在");
        }
        return diningTableMapper.insertDiningTable(diningTable);
    }

    /**
     * 修改餐台
     *
     * @param diningTable 餐台信息
     * @return 结果
     */
    @Override
    public int updateDiningTable(DiningTable diningTable) {
        return diningTableMapper.updateDiningTable(diningTable);
    }

    /**
     * 删除餐台
     *
     * @param id 餐台ID
     * @return 结果
     */
    @Override
    public int deleteDiningTableById(Long id) {
        return diningTableMapper.deleteDiningTableById(id);
    }

    /**
     * 批量删除餐台
     *
     * @param ids 需要删除的餐台ID
     * @return 结果
     */
    @Override
    public int deleteDiningTableByIds(Long[] ids) {
        return diningTableMapper.deleteDiningTableByIds(ids);
    }

    /**
     * 开台
     *
     * @param diningTable 餐台信息（包含开台人、就餐人数、开台时间）
     * @return 结果
     */
    @Override
    public int openTable(DiningTable diningTable) {
        // 检查餐台是否存在
        DiningTable table = diningTableMapper.selectDiningTableById(diningTable.getId());
        if (table == null) {
            throw new ServiceException("餐台不存在");
        }

        // 检查餐台状态
        if ("1".equals(table.getStatus())) {
            throw new ServiceException("餐台正在使用中，无法开台");
        }

        // 验证必填字段
        if (StringUtils.isEmpty(diningTable.getWaiterName())) {
            throw new ServiceException("开台人不能为空");
        }
        if (diningTable.getGuestCount() == null || diningTable.getGuestCount() <= 0) {
            throw new ServiceException("就餐人数必须大于0");
        }

        return diningTableMapper.openTable(diningTable);
    }

    /**
     * 换台
     *
     * @param oldTableId 原餐台ID
     * @param newTableId 新餐台ID
     * @return 结果
     */
    @Override
    @Transactional
    public int changeTable(Long oldTableId, Long newTableId) {
        // 检查原餐台
        DiningTable oldTable = diningTableMapper.selectDiningTableById(oldTableId);
        if (oldTable == null) {
            throw new ServiceException("原餐台不存在");
        }
        if (!"1".equals(oldTable.getStatus())) {
            throw new ServiceException("原餐台未在使用中，无法换台");
        }

        // 检查新餐台
        DiningTable newTable = diningTableMapper.selectDiningTableById(newTableId);
        if (newTable == null) {
            throw new ServiceException("新餐台不存在");
        }
        if (!"0".equals(newTable.getStatus())) {
            throw new ServiceException("新餐台不是空闲状态，无法换台");
        }

        // 执行换台操作（三步：1.更新订单表餐台号 2.更新新餐台 3.清空原餐台）
        // 1. 更新订单表的餐台号
        diningTableMapper.updateOrderTableNumber(oldTable.getTableNumber(), newTable.getTableNumber());

        // 2. 更新新餐台状态
        int result = diningTableMapper.changeTable(oldTableId, newTableId);

        // 3. 清空原餐台
        if (result > 0) {
            diningTableMapper.clearOldTable(oldTableId);
        }
        return result;
    }

    /**
     * 预定餐台
     *
     * @param diningTable 餐台信息（包含预定人、电话、预定时间、预定人数）
     * @return 结果
     */
    @Override
    public int reserveTable(DiningTable diningTable) {
        // 检查餐台是否存在
        DiningTable table = diningTableMapper.selectDiningTableById(diningTable.getId());
        if (table == null) {
            throw new ServiceException("餐台不存在");
        }

        // 检查餐台状态
        if (!"0".equals(table.getStatus())) {
            throw new ServiceException("餐台不是空闲状态，无法预定");
        }

        // 验证必填字段
        if (StringUtils.isEmpty(diningTable.getReservationName())) {
            throw new ServiceException("预定人姓名不能为空");
        }
        if (StringUtils.isEmpty(diningTable.getReservationPhone())) {
            throw new ServiceException("预定人电话不能为空");
        }
        if (diningTable.getReservationTime() == null) {
            throw new ServiceException("预定时间不能为空");
        }
        if (diningTable.getReservationCount() == null || diningTable.getReservationCount() <= 0) {
            throw new ServiceException("预定人数必须大于0");
        }

        return diningTableMapper.reserveTable(diningTable);
    }

    /**
     * 结账（清空餐台信息，状态改为空闲）
     *
     * @param id 餐台ID
     * @return 结果
     */
    @Override
    public int checkoutTable(Long id) {
        // 检查餐台是否存在
        DiningTable table = diningTableMapper.selectDiningTableById(id);
        if (table == null) {
            throw new ServiceException("餐台不存在");
        }

        // 检查餐台状态
        if (!"1".equals(table.getStatus())) {
            throw new ServiceException("餐台未在使用中，无法结账");
        }

        return diningTableMapper.checkoutTable(id);
    }

    /**
     * 初始化餐台数据
     *
     * @return 结果
     */
    @Override
    public int initializeTables() {
        return diningTableMapper.initializeTables();
    }
}

